﻿/*
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前，例如2+3*(7-4)+8/4的前缀表达式是：+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:
输入在一行内给出不超过30个字符的前缀表达式，只包含+、-、*、/以及运算数，不同对象（运算数、运算符号）之间以空格分隔。

输出格式:
输出前缀表达式的运算结果，保留小数点后1位，或错误信息ERROR。
*/
#include<iostream>
#include <string>
#include <stdio.h>
#include <stack>
#include<stdlib.h>
/*
date:20191016 6hours
level:11
user:Dongcheng Li
key:1.首先是输入，及其麻烦，以空格为分割输入字符串，最后读换行符，这样就通过字符串数组进行保存，之前只用过字符数组，而且string可以分割为字符数组，故忽略这一种方法
	2.其次在判断单个表达式上面做了非常多功夫，首先他其实是个a[][]的形式去辨认+x或-x,因为此时符号与数字之间是没有空格的
	3.第三个点在于除法时分母不为零，这个我本身是没有注意到的
	4.输出要用c来写，还要一位小数。前面都要double
	5.在从后往前读数组时要读到-1，因为a[0]只是作了压入操作
	6.第四个在于将输出统一放在末尾，几种特殊情况设置不同的状态标记
*/
using namespace std;
int main() {
	string a[30];
	stack <double>n;
	stack <string>f;

	char c;
	int g;
	
	string b;
	int wrong = 0;//分母不为零在下方ERROR通行证
	int wrong2 = 0;//单数字表达式在下方ERROR通行证
	int j;
	int t = 0, r = 0;
	double x,y;
	int i = 0;
	while(1)
	{
		cin >> a[i];
		c=getchar();
		
		if(c=='\n'){
			break;
		}
		i++;
	}
	
	if (i > 0) //+5和-5都是字符串数组里的一个元素
	{
		for (; i >= -1; i--)//这里将i>=0改成i>=-1，因为i=0时一定会执行下面的一个if的操作，把a[0]压入栈内
		{//再看下一个字符数组之前，先检查自身是否符合运算条件
			if (f.size() < 1 || n.size() < 2)//不足元素做运算
			{
				if (a[i] == "+" || a[i] == "-" || a[i] == "*" || a[i] == "/")
				//装入符号
				{
					f.push(a[i]);
					t++;
				}
				else//装入数字
				{
					r++;
					n.push(atof(&(a[i][0])));//atof()函数：&(a[i][0])就是把刚刚字符串首字符地址取出并将此字符串转换成double型。
				}

			}
			else//做运算
			{

				x = n.top();
				n.pop();
				y = n.top();
				n.pop();
				b = f.top();
				f.pop();
				if (b == "/")
				{
					if (y == 0)
					{
						wrong = 1;
						break;
					}
					n.push(x / y);
				}
				if (b == "+")
				{
					n.push(x + y);
				}
				if (b == "-")
				{
					n.push(x - y);
				}
				if (b == "*")
				{
					n.push(x * y);
				}
				if (i != -1)//等于-1就是最后的一个循环了，可以出去了
				{
					i++;//保留原地，即i在此轮循环中保持不变
				}
			}
		}
	}
	else
	{
		if ((a[0][0] == '+' || a[0][0] == '-') && !(a[0][1] == '+' || a[0][1] == '-'))
		{
			
			wrong2 = 1;
		}
		else
		{
			cout << "ERROR";
		}
	}
	if(wrong2==1)
	{
		printf("%0.1lf", atof(&(a[0][0])));//这里字符串仍要转换一次 
	}
	else 
	{
		if (t == r - 1&&wrong!=1)
		{
			printf("%0.1lf", n.top());
		}
		else
		{
			
				cout << "ERROR";
			
		}
	}

}